{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cartpole-v1, a.k.a Inverted Pendulum\n",
    "## Double Deep Q-Network (DDQN), solved in 1030 episodes\n",
    "## 1. Import packages, and annealing method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input_dim:  4 , output_dim:  2 , hidden_dim:  32\n",
      "threshold:  475.0\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "\n",
    "from collections import deque\n",
    "from ddqn_agent import Agent, FloatTensor\n",
    "from replay_buffer import ReplayMemory, Transition\n",
    "from  torch.autograd import Variable\n",
    "\n",
    "# set up matplotlib\n",
    "is_ipython = 'inline' in matplotlib.get_backend()\n",
    "if is_ipython:\n",
    "    from IPython import display\n",
    "\n",
    "plt.ion()\n",
    "\n",
    "use_cuda = torch.cuda.is_available()\n",
    "FloatTensor = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor\n",
    "device = torch.device(\"cuda\" if use_cuda else \"cpu\")\n",
    "\n",
    "BATCH_SIZE = 64  \n",
    "TAU = 0.005 # 1e-3   # for soft update of target parameters\n",
    "gamma = 0.99\n",
    "LEARNING_RATE = 0.001\n",
    "TARGET_UPDATE = 10\n",
    "\n",
    "num_episodes = 20000\n",
    "print_every = 10\n",
    "hidden_dim = 32 ## 16 \n",
    "min_eps = 0.01\n",
    "max_eps_episode = 150 ## 50\n",
    "\n",
    "env = gym.make('CartPole-v1')\n",
    "env = gym.wrappers.Monitor(env, directory=\"monitors\", force=True)\n",
    "        \n",
    "space_dim =  env.observation_space.shape[0] # n_spaces\n",
    "action_dim = env.action_space.n # n_actions  \n",
    "print('input_dim: ', space_dim, ', output_dim: ', action_dim, ', hidden_dim: ', hidden_dim)\n",
    "\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n",
    "\n",
    "agent = Agent(space_dim, action_dim, hidden_dim)\n",
    "\n",
    "    \n",
    "def epsilon_annealing(i_epsiode, max_episode, min_eps: float):\n",
    "    ##  if i_epsiode --> max_episode, ret_eps --> min_eps\n",
    "    ##  if i_epsiode --> 1, ret_eps --> 1  \n",
    "    slope = (min_eps - 1.0) / max_episode\n",
    "    ret_eps = max(slope * i_epsiode + 1.0, min_eps)\n",
    "    return ret_eps        \n",
    "\n",
    "def save(directory, filename):\n",
    "    torch.save(agent.q_local.state_dict(), '%s/%s_local.pth' % (directory, filename))\n",
    "    torch.save(agent.q_target.state_dict(), '%s/%s_target.pth' % (directory, filename))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Only one episode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_episode(env, agent, eps):\n",
    "    \"\"\"Play an epsiode and train\n",
    "\n",
    "    Args:\n",
    "        env (gym.Env): gym environment (CartPole-v0)\n",
    "        agent (Agent): agent will train and get action        \n",
    "        eps (float): eps-greedy for exploration\n",
    "\n",
    "    Returns:\n",
    "        int: reward earned in this episode\n",
    "    \"\"\"\n",
    "    state = env.reset()\n",
    "    done = False\n",
    "    total_reward = 0\n",
    "    \n",
    "\n",
    "    while not done:\n",
    "\n",
    "        action = agent.get_action(FloatTensor([state]), eps)\n",
    "        \n",
    "        next_state, reward, done, _ = env.step(action.item())\n",
    "\n",
    "        total_reward += reward\n",
    "\n",
    "        if done:\n",
    "            reward = -1\n",
    "                    \n",
    "        # Store the transition in memory\n",
    "        agent.replay_memory.push(\n",
    "                (FloatTensor([state]), \n",
    "                 action, # action is already a tensor\n",
    "                 FloatTensor([reward]), \n",
    "                 FloatTensor([next_state]), \n",
    "                 FloatTensor([done])))\n",
    "                 \n",
    "\n",
    "        if len(agent.replay_memory) > BATCH_SIZE:\n",
    "\n",
    "            batch = agent.replay_memory.sample(BATCH_SIZE)\n",
    "            \n",
    "            agent.learn(batch, gamma)\n",
    "\n",
    "        state = next_state\n",
    "\n",
    "\n",
    "    return total_reward\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Train, 1030 episodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:    10 Score:  24.0  Avg.Score: 23.73, eps-greedy:  0.93 Time: 00:00:03\n",
      "Episode:    20 Score:  30.0  Avg.Score: 22.33, eps-greedy:  0.87 Time: 00:00:03\n",
      "Episode:    30 Score: 103.0  Avg.Score: 25.35, eps-greedy:  0.80 Time: 00:00:04\n",
      "Episode:    40 Score:  30.0  Avg.Score: 24.76, eps-greedy:  0.74 Time: 00:00:05\n",
      "Episode:    50 Score:  32.0  Avg.Score: 28.61, eps-greedy:  0.67 Time: 00:00:06\n",
      "Episode:    60 Score: 197.0  Avg.Score: 34.82, eps-greedy:  0.60 Time: 00:00:07\n",
      "Episode:    70 Score: 106.0  Avg.Score: 41.20, eps-greedy:  0.54 Time: 00:00:12\n",
      "Episode:    80 Score: 161.0  Avg.Score: 54.96, eps-greedy:  0.47 Time: 00:00:15\n",
      "Episode:    90 Score: 140.0  Avg.Score: 67.38, eps-greedy:  0.41 Time: 00:00:19\n",
      "Episode:   100 Score: 214.0  Avg.Score: 79.91, eps-greedy:  0.34 Time: 00:00:24\n",
      "Episode:   110 Score: 357.0  Avg.Score: 104.17, eps-greedy:  0.27 Time: 00:00:30\n",
      "Episode:   120 Score: 296.0  Avg.Score: 125.53, eps-greedy:  0.21 Time: 00:00:36\n",
      "Episode:   130 Score: 318.0  Avg.Score: 153.79, eps-greedy:  0.14 Time: 00:00:48\n",
      "Episode:   140 Score: 278.0  Avg.Score: 181.97, eps-greedy:  0.08 Time: 00:00:55\n",
      "Episode:   150 Score: 256.0  Avg.Score: 201.80, eps-greedy:  0.01 Time: 00:01:01\n",
      "Episode:   160 Score: 217.0  Avg.Score: 218.56, eps-greedy:  0.01 Time: 00:01:07\n",
      "Episode:   170 Score: 183.0  Avg.Score: 230.99, eps-greedy:  0.01 Time: 00:01:12\n",
      "Episode:   180 Score: 195.0  Avg.Score: 238.65, eps-greedy:  0.01 Time: 00:01:18\n",
      "Episode:   190 Score: 176.0  Avg.Score: 240.60, eps-greedy:  0.01 Time: 00:01:23\n",
      "Episode:   200 Score: 152.0  Avg.Score: 237.87, eps-greedy:  0.01 Time: 00:01:27\n",
      "Episode:   210 Score: 148.0  Avg.Score: 225.90, eps-greedy:  0.01 Time: 00:01:30\n",
      "Episode:   220 Score: 131.0  Avg.Score: 215.89, eps-greedy:  0.01 Time: 00:01:36\n",
      "Episode:   230 Score: 116.0  Avg.Score: 196.40, eps-greedy:  0.01 Time: 00:01:39\n",
      "Episode:   240 Score: 116.0  Avg.Score: 177.83, eps-greedy:  0.01 Time: 00:01:42\n",
      "Episode:   250 Score: 117.0  Avg.Score: 165.14, eps-greedy:  0.01 Time: 00:01:45\n",
      "Episode:   260 Score: 118.0  Avg.Score: 153.39, eps-greedy:  0.01 Time: 00:01:48\n",
      "Episode:   270 Score: 101.0  Avg.Score: 142.35, eps-greedy:  0.01 Time: 00:01:50\n",
      "Episode:   280 Score: 116.0  Avg.Score: 132.16, eps-greedy:  0.01 Time: 00:01:53\n",
      "Episode:   290 Score: 122.0  Avg.Score: 126.13, eps-greedy:  0.01 Time: 00:01:56\n",
      "Episode:   300 Score: 147.0  Avg.Score: 126.43, eps-greedy:  0.01 Time: 00:02:00\n",
      "Episode:   310 Score: 165.0  Avg.Score: 128.70, eps-greedy:  0.01 Time: 00:02:05\n",
      "Episode:   320 Score: 171.0  Avg.Score: 132.24, eps-greedy:  0.01 Time: 00:02:09\n",
      "Episode:   330 Score: 169.0  Avg.Score: 137.78, eps-greedy:  0.01 Time: 00:02:14\n",
      "Episode:   340 Score: 141.0  Avg.Score: 139.73, eps-greedy:  0.01 Time: 00:02:18\n",
      "Episode:   350 Score:  11.0  Avg.Score: 138.97, eps-greedy:  0.01 Time: 00:02:22\n",
      "Episode:   360 Score:  12.0  Avg.Score: 129.98, eps-greedy:  0.01 Time: 00:02:23\n",
      "Episode:   370 Score: 500.0  Avg.Score: 133.31, eps-greedy:  0.01 Time: 00:02:26\n",
      "Episode:   380 Score: 172.0  Avg.Score: 143.47, eps-greedy:  0.01 Time: 00:02:32\n",
      "Episode:   390 Score: 223.0  Avg.Score: 152.84, eps-greedy:  0.01 Time: 00:02:37\n",
      "Episode:   400 Score: 244.0  Avg.Score: 159.32, eps-greedy:  0.01 Time: 00:02:43\n",
      "Episode:   410 Score: 286.0  Avg.Score: 169.83, eps-greedy:  0.01 Time: 00:02:50\n",
      "Episode:   420 Score: 195.0  Avg.Score: 172.26, eps-greedy:  0.01 Time: 00:02:55\n",
      "Episode:   430 Score: 120.0  Avg.Score: 167.70, eps-greedy:  0.01 Time: 00:02:59\n",
      "Episode:   440 Score: 111.0  Avg.Score: 165.44, eps-greedy:  0.01 Time: 00:03:02\n",
      "Episode:   450 Score: 133.0  Avg.Score: 167.85, eps-greedy:  0.01 Time: 00:03:05\n",
      "Episode:   460 Score: 110.0  Avg.Score: 176.90, eps-greedy:  0.01 Time: 00:03:09\n",
      "Episode:   470 Score: 105.0  Avg.Score: 175.27, eps-greedy:  0.01 Time: 00:03:12\n",
      "Episode:   480 Score: 114.0  Avg.Score: 164.29, eps-greedy:  0.01 Time: 00:03:15\n",
      "Episode:   490 Score: 131.0  Avg.Score: 155.68, eps-greedy:  0.01 Time: 00:03:19\n",
      "Episode:   500 Score: 132.0  Avg.Score: 145.97, eps-greedy:  0.01 Time: 00:03:24\n",
      "Episode:   510 Score: 124.0  Avg.Score: 131.45, eps-greedy:  0.01 Time: 00:03:27\n",
      "Episode:   520 Score: 138.0  Avg.Score: 125.20, eps-greedy:  0.01 Time: 00:03:32\n",
      "Episode:   530 Score: 131.0  Avg.Score: 125.42, eps-greedy:  0.01 Time: 00:03:36\n",
      "Episode:   540 Score: 126.0  Avg.Score: 130.35, eps-greedy:  0.01 Time: 00:03:40\n",
      "Episode:   550 Score: 500.0  Avg.Score: 159.61, eps-greedy:  0.01 Time: 00:03:51\n",
      "Episode:   560 Score: 500.0  Avg.Score: 180.79, eps-greedy:  0.01 Time: 00:03:59\n",
      "Episode:   570 Score: 136.0  Avg.Score: 189.13, eps-greedy:  0.01 Time: 00:04:04\n",
      "Episode:   580 Score: 500.0  Avg.Score: 225.00, eps-greedy:  0.01 Time: 00:04:19\n",
      "Episode:   590 Score: 240.0  Avg.Score: 243.33, eps-greedy:  0.01 Time: 00:04:28\n",
      "Episode:   600 Score: 215.0  Avg.Score: 254.57, eps-greedy:  0.01 Time: 00:04:34\n",
      "Episode:   610 Score: 172.0  Avg.Score: 262.54, eps-greedy:  0.01 Time: 00:04:40\n",
      "Episode:   620 Score: 184.0  Avg.Score: 272.68, eps-greedy:  0.01 Time: 00:04:48\n",
      "Episode:   630 Score: 242.0  Avg.Score: 283.82, eps-greedy:  0.01 Time: 00:04:55\n",
      "Episode:   640 Score: 240.0  Avg.Score: 293.43, eps-greedy:  0.01 Time: 00:05:02\n",
      "Episode:   650 Score: 401.0  Avg.Score: 292.25, eps-greedy:  0.01 Time: 00:05:13\n",
      "Episode:   660 Score: 320.0  Avg.Score: 303.02, eps-greedy:  0.01 Time: 00:05:26\n",
      "Episode:   670 Score: 212.0  Avg.Score: 325.61, eps-greedy:  0.01 Time: 00:05:37\n",
      "Episode:   680 Score: 134.0  Avg.Score: 291.85, eps-greedy:  0.01 Time: 00:05:41\n",
      "Episode:   690 Score: 126.0  Avg.Score: 273.16, eps-greedy:  0.01 Time: 00:05:44\n",
      "Episode:   700 Score: 135.0  Avg.Score: 263.38, eps-greedy:  0.01 Time: 00:05:48\n",
      "Episode:   710 Score: 119.0  Avg.Score: 254.85, eps-greedy:  0.01 Time: 00:05:51\n",
      "Episode:   720 Score: 120.0  Avg.Score: 243.21, eps-greedy:  0.01 Time: 00:05:54\n",
      "Episode:   730 Score: 130.0  Avg.Score: 231.41, eps-greedy:  0.01 Time: 00:06:00\n",
      "Episode:   740 Score: 132.0  Avg.Score: 217.97, eps-greedy:  0.01 Time: 00:06:03\n",
      "Episode:   750 Score: 122.0  Avg.Score: 188.96, eps-greedy:  0.01 Time: 00:06:06\n",
      "Episode:   760 Score: 125.0  Avg.Score: 158.15, eps-greedy:  0.01 Time: 00:06:09\n",
      "Episode:   770 Score: 117.0  Avg.Score: 128.60, eps-greedy:  0.01 Time: 00:06:13\n",
      "Episode:   780 Score: 127.0  Avg.Score: 128.43, eps-greedy:  0.01 Time: 00:06:17\n",
      "Episode:   790 Score: 134.0  Avg.Score: 128.20, eps-greedy:  0.01 Time: 00:06:21\n",
      "Episode:   800 Score: 119.0  Avg.Score: 125.92, eps-greedy:  0.01 Time: 00:06:25\n",
      "Episode:   810 Score:  12.0  Avg.Score: 126.08, eps-greedy:  0.01 Time: 00:06:29\n",
      "Episode:   820 Score: 174.0  Avg.Score: 127.76, eps-greedy:  0.01 Time: 00:06:33\n",
      "Episode:   830 Score: 500.0  Avg.Score: 146.07, eps-greedy:  0.01 Time: 00:06:41\n",
      "Episode:   840 Score: 172.0  Avg.Score: 150.33, eps-greedy:  0.01 Time: 00:06:45\n",
      "Episode:   850 Score: 225.0  Avg.Score: 157.29, eps-greedy:  0.01 Time: 00:06:50\n",
      "Episode:   860 Score: 500.0  Avg.Score: 178.30, eps-greedy:  0.01 Time: 00:06:59\n",
      "Episode:   870 Score: 500.0  Avg.Score: 210.99, eps-greedy:  0.01 Time: 00:07:11\n",
      "Episode:   880 Score: 189.0  Avg.Score: 234.90, eps-greedy:  0.01 Time: 00:07:22\n",
      "Episode:   890 Score: 407.0  Avg.Score: 243.76, eps-greedy:  0.01 Time: 00:07:28\n",
      "Episode:   900 Score: 500.0  Avg.Score: 267.96, eps-greedy:  0.01 Time: 00:07:38\n",
      "Episode:   910 Score: 500.0  Avg.Score: 305.42, eps-greedy:  0.01 Time: 00:07:50\n",
      "Episode:   920 Score: 500.0  Avg.Score: 342.09, eps-greedy:  0.01 Time: 00:08:03\n",
      "Episode:   930 Score: 500.0  Avg.Score: 341.77, eps-greedy:  0.01 Time: 00:08:10\n",
      "Episode:   940 Score: 500.0  Avg.Score: 374.82, eps-greedy:  0.01 Time: 00:08:23\n",
      "Episode:   950 Score: 202.0  Avg.Score: 400.13, eps-greedy:  0.01 Time: 00:08:35\n",
      "Episode:   960 Score: 500.0  Avg.Score: 415.64, eps-greedy:  0.01 Time: 00:08:48\n",
      "Episode:   970 Score: 500.0  Avg.Score: 419.00, eps-greedy:  0.01 Time: 00:09:01\n",
      "Episode:   980 Score: 500.0  Avg.Score: 431.23, eps-greedy:  0.01 Time: 00:09:13\n",
      "Episode:   990 Score: 500.0  Avg.Score: 459.48, eps-greedy:  0.01 Time: 00:09:26\n",
      "Episode:  1000 Score: 500.0  Avg.Score: 471.68, eps-greedy:  0.01 Time: 00:09:45\n",
      "Episode:  1010 Score: 500.0  Avg.Score: 471.68, eps-greedy:  0.01 Time: 00:09:58\n",
      "Episode:  1020 Score: 500.0  Avg.Score: 465.13, eps-greedy:  0.01 Time: 00:10:09\n",
      "\n",
      " Environment solved in 1029 episodes!\tAverage Score: 478.68\n"
     ]
    }
   ],
   "source": [
    "def train():    \n",
    "\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = []    \n",
    "    \n",
    "    time_start = time.time()\n",
    "\n",
    "    for i_episode in range(num_episodes):\n",
    "        eps = epsilon_annealing(i_episode, max_eps_episode, min_eps)\n",
    "        score = run_episode(env, agent, eps)\n",
    "\n",
    "        scores_deque.append(score)\n",
    "        scores_array.append(score)\n",
    "        \n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "\n",
    "        dt = (int)(time.time() - time_start)\n",
    "            \n",
    "        if i_episode % print_every == 0 and i_episode > 0:\n",
    "            print('Episode: {:5} Score: {:5}  Avg.Score: {:.2f}, eps-greedy: {:5.2f} Time: {:02}:{:02}:{:02}'.\\\n",
    "                    format(i_episode, score, avg_score, eps, dt//3600, dt%3600//60, dt%60))\n",
    "            \n",
    "        if len(scores_deque) == scores_deque.maxlen:\n",
    "            ### 195.0: for cartpole-v0 and 475 for v1\n",
    "            if np.mean(scores_deque) >= threshold: \n",
    "                print('\\n Environment solved in {:d} episodes!\\tAverage Score: {:.2f}'. \\\n",
    "                    format(i_episode, np.mean(scores_deque)))\n",
    "                break\n",
    "\n",
    "                        \n",
    "        if i_episode % TARGET_UPDATE == 0:\n",
    "            agent.q_target.load_state_dict(agent.q_local.state_dict()) \n",
    "    \n",
    "    return scores_array, avg_scores_array\n",
    "\n",
    "scores, avg_scores = train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "length of scores:  1030 , len of avg_scores:  1030\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAEGCAYAAABRil7tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOydeXxU1fm4nzMzWQkQAmELQhAIEHYBUQRkcZe6IO61ttW6Va173Vtrrbb9ulRb1/ZXNywo7hsqbuCCsu8ICEGWAIEAgYQks5zfH3dmcmfm3pk7WzIzOc/nAzP33nPPvPfM5L7vfc973ldIKVEoFAqFQqFIBWwtLYBCoVAoFAqFD2WYKBQKhUKhSBmUYaJQKBQKhSJlUIaJQqFQKBSKlEEZJgqFQqFQKFIGR0sLEA+dOnWSpaWlLS2GQqFQpBWLFy/eI6Usbmk5FAoj0towKS0tZdGiRS0thkKhUKQVQogtLS2DQmGGmspRKBQKhUKRMijDRKFQKBQKRcqgDBOFQqFQKBQpQ1rHmCgUCoUidVi8eHFnh8Pxb2Aw6sFXYY4HWOVyuS4fOXLk7uCDyjBRKBQKRUJwOBz/7tq168Di4uJ9NptNFWJTGOLxeERVVVX5zp07/w2cEXw8qRatEKJCCLFSCLFMCLHIu69ICPGJEGKD97WDd78QQjwuhNgohFghhDgqmbIpFAqFIuEMLi4urlFGiSIcNptNFhcXH0DzrIUebwYZJkkph0spR3m3bwc+lVL2Az71bgOcCvTz/rsCeKoZZFMoFApF4rApo0RhBe/vxNAGaYmpnDOBid73LwBfAL/37n9RSimBBUKIQiFENyllZQvI2CI0ujy8vWw7pZ3a0C43i/5d27a0SCnFR6t3MqJnIZ3b5ra0KHGxr7aRv85ZR6eCHGwCJg7oTK+ifF757icmDejM4JL21DvdPP9NBVv21pFtFxTkOhjfr5hjjuwY12f/sPMgz8z7kV8cW4qUks/W7SbHYcMj4bi+nahtcDGhLP3ybm3bV8e/52/m8vG96dEhP+S4y+3hv19XUNfo5ttNeyjMy6Zv5wIApo/sQWmnNv629U437y7fQW2Di+raRsPPk8CmPbWM69uJvYcaaHR5/Mc2Vh2ib3EBHgk2oe2rbXSzv85JSaH5b7fRLcnNsuHxGOt1X39OjyTbbmPygM4MO6Iw0tAoFGlHsg0TCXwshJDAM1LKZ4EuPmNDSlkphOjsbVsCbNWdu827L8AwEUJcgeZRoWfPnkkWv3l5/NMN/PPzjf7tiodOb0FpUosGl5srX1pM384FzL3p+JYWJy6uenkx322u9m8v33aAE8q78PAn6/m+opqXLhvDki37eOjDdQHn/evzH+P6TSz5aR/TnvwGgM/X7cYj4cBhp//4I5+sB9Lzd3fKY/M51ODi9cXbWHnfySHH//t1BQ98sDZw52rt5Z+fb+Szm4/nyGLNUHn44x94bv5mfzMhQj9Pem2H91dUBrSTBjZF8P5w/Zm1Meo3yy6UYWLA73//+66vv/56R5vNJm02G08++eSWyZMn17a0XArrJNswOU5KucNrfHwihFgXpq3Bnyshf45e4+ZZgFGjRmWUy3D3wfqWFiFl8d2Yf9pb17KCJIDt+w8HbHukpK7BBTRdp8vkqTkefEYJwL46Z5iW6cch7/gd9L4GU11n7Pnw8evnF/LFrZMAqDrY4N//6PnDOHtEj5D2Rz8wl926dl/fPpmSwjz+OmcdT33xo3//eaN68Lfpwyi9/X0APrphgqEndM6qSq56eQkA6+4/hdwse8DxG2Yu5a1lOwL2TR95RNhrao3MnTu3zUcffVS4cuXKNXl5ebKystLR0NBgpFss4XQ6ycrKSqSICgskNcZESrnD+7obeBM4GtglhOgG4H31LRXaBuj/0noAgX+JGY7RU5FCw/cEKUNt1bTD6Gm43qlNBeRmaX+S6X+VqYUtgmpy6/74bEYujSCsfj/2oA8261roDgSfY4YFMVsd27dvzyoqKnLl5eVJgG7durlKS0udX375Zf6IESMG9O/fv3zIkCED9+3bZ6urqxPTp08vLSsrKx84cGD5u+++2xbg8ccf73jqqaceOXny5L7jx48vA7jnnnu6DB48eGBZWVn5jTfe2L0lr7E1kDSPiRCiDWCTUh70vj8J+BPwDnAp8JD39W3vKe8A1wohZgJjgAOtKb4ElDIKh09vZILxJgycg4edbv9RAJkJF5pCGI25niyb7hlN6N9Gp/2DWwcbOWa96dvZDSwOkYZWyK2zlx+xfufB0ICfOCjr2rbu79OHbTU7ftZZZ9U8+OCD3UtLSwePGzeu5sILL6yeMmVK7cUXX9xnxowZPx5//PF11dXVtoKCAs+f//znLgDr169fs3Tp0tzTTjut348//rgKYMmSJQUrVqxY3aVLF/cbb7zRbuPGjbkrVqxYK6XkhBNO6Pvhhx8WnHrqqYcSeW2KJpI5ldMFeNP7B+UAXpFSzhFCLAReFUJcBvwEnOtt/wFwGrARqAN+lUTZUhKliyKTCUMU4jFBUu83TKTuf0WiiOSEyLI3GSZWPCbBLXzbwaeGekyM+9Z9PDarHhNLrVoX7du396xatWrNnDlz2n766adtL7300j433nhjZefOnZ3HH398HUBRUZEH4Jtvvim47rrrdgOMGDGivnv37o0rV67MBRg/fnxNly5d3ABz5sxpN2/evHbl5eXlAHV1dbZ169blKsMkeSTNMJFSbgKGGezfC0wx2C+B3yZLnnQgE6YpkkWTxyT9x8hI8TW4NMPEf3npf5kpRSSPg8PedFzf0uw0s68n2MMS4jGxMJVj3K/VnalDOM9GMnE4HEydOvXg1KlTDw4dOvTw008/XexdgBFAuHtJfn6+R9/uhhtuqLz11lv3JElkRRAqZXAqoZSRKTKDPAnB+kRKONzoDtyXEVeaOkRygjh0XopEzpqEeEzM2kX6UO/hNJzRaVaWL1+es3Llyhzf9tKlS/P69etXv2vXruwvv/wyH2Dfvn02p9PJuHHjDr388stFACtWrMiprKzMHjp0aMgKhFNPPbXmpZde6nTgwAEbwObNm7O2b9+usqYnETW4irQgk2JMgrWTPvhV6vYpEkek6RlHvFM5JoaD1akcK5/p+1yfiR5t/EtroKamxn799df3rKmpsdvtdllaWtrwwgsvbFm/fv2e66+/vmd9fb0tNzfXM2/evPW33Xbb7ksuuaRXWVlZud1u55lnnqnwBc3qmTZtWs3q1atzR48ePQA0b8qMGTM2l5SUGC8BU8SNMkxSCKWLzMmksTFSJ01TOdqVJmG1cKsmUthGojwmkYJfzeSwRfBd+4wQIQQFspZvcq5HrH4Ijrk0Rkkzk/Hjx9ctXbo0JC1Ft27dXMuXLw/Z//rrr1cE77v++uv3Anv1++65557d99xzT0ixOUVyUFM5KUQmxE8ki0wam2BlJQ0mbnzX+9dzhjSTVJlNpBiO7zZXc+try0PaWl0NI0zmWuw2k3ZBROMx6S120k7UIXNUZmhFZqIMkxQic1Rv4smksQmX+TM49nVQ9/YU5CjHZrxY0fuvLd6mtbXQn+U8JhaDX32GiQMX1O4J+Vfg3o8DF0JAb6FlUfB06GNRCoUivVB3vBQig5wCCSeTxib4qVl/bcGxNFo68wy6+BbCqkcCAo2HaGd1QqZyLC799XlWZmb/Gf6+PuT4fcBZ2X15wHMpN9pnA+DpcGSU0ikU6YEyTFIIpX7CkEGDY+gxCXr1vVMBjokhmlG0BUzlWOvPNPg1OMbExFARQpBDI8PFRig7FfoGZlRY/tV7jKj5gtm2e5p2OnJQKDIRZZikEOrJuHUQHLcgCf3uAzwmSZKjQ35WxtXMMSMqj0kcnxOSxySK5cJ9xQ4cwgPDzodBZwccX7DGwbCaL/zbKz2lhFbwUSgyAxVjkkIos8ScTMrrEU7x+QwU39WaVaxNBL07tUlOxymI1SkVCAp+jdNjZbVWjsN5kH9k/VPb6Dwo5PjW/HJqpJbd/S/OC7m48U6V00SRsSjDJJXIHN2bcDLJmRSiUAyuze8xSeJUzpKf9iet71QjmlG0ovCDvzLTlPQhtXKMOy/a+AZ9bTtY7jkSOoYGtTpteYxqeIqRnhd41v0zaiiILGQr5sUXXywUQoxcunRpbkvLArBz5077mDFjyvLz80f84he/6Kk/Nn/+/PyysrLynj17Dv7lL395hMej5TTatWuXfezYsf169eo1eOzYsf2qqqrshp1HyfHHH993z549cfX13nvvtZ00aVLfRMhjhDJMUohM8gokmkwambCrcvyrc6S/rZXfRaPL48+FogglCodJgPEQrVciUvCrmRztKj5klyzkzMb7wRaqM4SARrKop0nPqvgjc2bOnFl01FFHHXrppZeKWloWgPz8fPmnP/1pxx//+MdtwceuueaaXk8++eSWioqKVZs2bcqdPXt2O4A//OEP3SZOnHhwy5YtqyZOnHjw3nvv7ZoIWb788suNnTp1SumbhTJMUohM8gokmkyKvzHOY2ISY4K138XoB+ZSfu9HCZIw84hmKsdK05AmpsGvkU4E6qpps+NbZronmTTQyxbHkqFWwoEDB2yLFi0q+O9//1vx5ptvdvDtP/3004+cNWtWe9/2OeecU/r8888XHjx40HbaaacdWVZWVn766acfOXTo0AHz5s0LqYr89ttvtx04cGB5WVlZ+bnnnlt6+PBhAVBSUjLkxhtv7F5eXj6wrKys3MhL065dO8/JJ598KDc316Pfv2XLlqxDhw7ZTjjhhFqbzcbFF1+896233uoAMGfOnMIrr7xyL8CVV16598MPP+wQ3K/L5eLKK6/sMXjw4IFlZWXlf//73zuB5tEYNWpU/xNPPLFPnz59Bl100UU93W7NFikpKRlSWVnpqKmpsU2cOLFv//79y/v16zfoueee6xDuOmfPnt2ud+/eg0aOHNl/9uzZhT4ZampqbOeee27p4MGDBw4cOLD85ZdfLgRYtGhR7pAhQwYOGDCgvKysrFxfKiASKvg1hcgg3ZtwMmlojPRJsKdEH2NihQOHW0cQa6zEOpVjdp5pEb+QBGsWpnK2LwFggac8skzpZIy89dsj2L0mRMHHRefyOs76V9jigDNmzCicOHHigaFDhzYUFha6v/rqq/xx48bVnX/++dWzZs3qcP755x+or68XX3/9dbsXXnhhy9/+9rfOhYWF7vXr169ZuHBh7rHHHhsS5FNXVyeuvPLK3h9//PEPQ4cObTj77LNL//73vxffe++9uwE6derkWrNmzdqHHnqo+KGHHuoya9asLVYuZ8uWLVndunXz//H26tWrsbKyMgtg7969jl69ejm9+53V1dUh+vqxxx7r1L59e/eqVavWHj58WIwePXrAz372sxqAlStXtlm6dOmqsrKyxgkTJvR78cUXO/zqV7/a5zv3jTfeaNe1a1fnF198sdH7eXaz67zllluqrr322tJPPvnkh0GDBjVMnTrVv1b9zjvv7DZp0qSa1157rWLPnj32UaNGDTzjjDNqnnjiieJrrrlm19VXX11dX18vXC7rGfyVxySF8CjLxJSMGppgj4lhHhO/aZJRRllLYTWDK0S3gidiX1amcrYtRAobKzzh8pII3f/ePelkpDQjr776atGFF164D+Ccc86p9k3nTJ8+/cA333zT7vDhw2L27Nntjz766IMFBQXym2++KbjwwgurAUaPHl1fVlZWF9zn8uXLc3v06NEwdOjQBoBf/vKXe7/66it/6t2LLrpoH8DRRx9dt3XrVsueASNPcDS/1blz57Z79dVXOw4YMKB8xIgRA/ft2+dYs2ZNLsCQIUNqy8vLGx0OB+edd171/PnzAwKTjjrqqMPz589vd/XVV5fMmTOnoGPHjm6z61y2bFlujx49GoYMGdLg8+z4+vniiy/aPfroo90GDBhQPm7cuP4NDQ1i48aN2ccee2ztww8/3O2uu+7qumHDhuyCggLLtzLlMUkhlAIyJ5Pib8J5TELaNlVtU8RBVMaG3mNiNY+JiSsjNPOrQbtt3+MsGkDt9rzIogWsGEpxIng2ksHOnTvtCxYsaLd+/fq8a6+9FrfbLYQQ8qmnntqWn58vjznmmINvvPFGu1mzZnXwGSNWpokjtcnNzZUADodDulwuy19NaWmp0+chAdiyZUt2165dnQAdO3Z0bdmyJatXr17OLVu2ZBUVFYW4HKSU4uGHH/7pnHPOqdHvf++999oG/9aCt4cOHdqwZMmSNa+//nr7u+66q2Tu3Lk106ZNM42INzOYpJTMnj1747Bhwxr0+4866qj68ePH17755pvtTz311LInn3yy4owzzjhoOhg6lMckhcgor0CiyaCxCX5qluimcIIzvzafWBlNdHZJgF8irs+JmMfE44Fti2noNtJSv8pLEp6XXnqpw7Rp0/bu2LFj5fbt21fu3LlzRY8ePRo//vjjAoALLrig+vnnn++0cOHCttOmTasBGDt27KGZM2d2AFi8eHHu+vXrQyzE4cOH12/fvj171apVOQAvvvhix/Hjx1tSsuHo1auXs02bNp5PP/20jcfjYcaMGR3PPPPM/QAnn3zy/meeeaYjwDPPPNPxlFNOCTEaTjzxxANPPfVUcUNDgwBYsWJFTk1NjQ20qZx169Zlu91uZs+eXRQsb0VFRVbbtm0911xzTfUNN9ywa9myZflm1zl8+PD6bdu2Za9evToHtOBiXz+TJk2qefjhh7v4VhN9/fXXeQBr1qzJHjhwYMPdd9+9+6STTtq/bNmyyJa3F+UxSSkySPsmmEwaGaMnj9AYE+lvm0neopYimlU50bT14ftKgx8uItbK2bsBGg7gjGCY+M8P6EtZKcG89tprHW+77bZK/b4zzzxz30svvVR0yimnHDr77LNrrrrqqt4nnHDCfp+X49Zbb60677zzSsvKysoHDx5c179//8MdOnQIWLWSn58vn3766Ypzzz23j9vtZtiwYXW33HJLVTSylZSUDDl06JDd6XSKjz76qPCDDz5YP3LkyPonn3xyy2WXXda7vr5eTJo0qebcc889AHDfffdVnn322X169erVqXv37o1vvfXWj8F93njjjXsqKipyhgwZMlBKKYqKipwffPDBjwDDhw8/dPPNN/dYt25d3pgxYw5ecsklAYbN4sWL8+64444e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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "    \n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print('length of scores: ', len(scores), ', len of avg_scores: ', len(avg_scores))\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Save the weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "save('dir_chk_V1_ddqn', 'cartpole-v1-ddqn')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
